package main

import (
	"fmt"
	"strconv"
	"strings"
)

// var m1 = map[int]int{}

// func fib1(n int) int {
// 	switch {
// 	case n == 0:
// 		m1[n] = 0
// 		return 0
// 	case n == 1 || n == 2:
// 		m1[n] = 1
// 		return 1
// 	}
// 	if v, ok := m1[n]; ok {
// 		return v
// 	} else {
// 		t := fib1(n-1) + fib1(n-2)
// 		m1[n] = t
// 		return t
// 	}

// 	// return fib1(n-1) + fib1(n-2)
// }

// func fib2(n int) int {
// 	switch {
// 	case n == 0:
// 		return 0
// 	case n == 1 || n == 2:
// 		return 1
// 	}
// 	return fib2(n-1) + fib2(n-2)
// }

// func fib3(n int) int {
// 	switch {
// 	case n < 0:
// 		panic("n is negative")
// 	case n == 0:
// 		return 0
// 	case n == 1 || n == 2:
// 		return 1
// 	}
// 	a, b := 1, 1
// 	for i := 1; i <= n-2; i++ {
// 		a, b = b, a+b

// 	}
// 	return b

// }

// func defer1() {
// 	fmt.Println("defer的意思是延迟、推迟执行的意思。在某函数中使用defer语句时,会使defer语句延后执行。当该函数执行返回或panic时，然后执行defer后的语句。注意os.exit不再此范围内,不会执行defer")

// 	fmt.Println("defer的应用主要是资源释放。如打开文件要关闭，网络连接后要关闭，获得锁要释放锁，以上场景中，获得资源后紧跟着写defer语句，以确保函数正常退出或panic时，能够释放资源。")
// }

func printTrangle(n int) {
	for i := 1; i < n; i++ {
		for j := n; j > 0; j-- {
			if j > i {
				len1 := len(strconv.Itoa(j))
				fmt.Print(strings.Repeat(" ", len1+1))
			} else {
				fmt.Print(" ", j)
			}
		}
		fmt.Println()
	}
}
func main() {
	// fmt.Println(fib1(45))
	// fmt.Println("~~~~~~~~~~~~~~~~~~")
	// fmt.Println(fib3(45))
	// fmt.Println("~~~~~~~~~~~~~~~~~~")
	// fmt.Println(fib2(45))
	// defer1()
	printTrangle(13)
}
